package demo4

import (
	"fmt"
)

// Dictionary 词典
type Dictionary struct {
	data map[interface{}]interface{} // 键值都是 interface{}
}

// Get 根据 key 获取 value
func (d *Dictionary) Get(key interface{}) interface{} {
	return d.data[key]
}

// Set 设置 key, value
func (d *Dictionary) Set(key interface{}, value interface{}) {
	d.data[key] = value
}

// Visit 遍历 keys， 如果回调返回值为 false, 停止遍历
func (d *Dictionary) Visit(callback func(k, v interface{}) bool) {
	// 如果没有 callback， return
	if callback == nil {
		return
	}

	for k, v := range d.data {
		// 如果回调返回值为 false, 停止遍历
		if !callback(k, v) {
			return
		}
	}
}

// Clear 清空所有的数据
func (d *Dictionary) Clear() {
	d.data = make(map[interface{}]interface{})
}

// NewDictionary 创建一个 Dictionary
func NewDictionary() *Dictionary {
	d := &Dictionary{}

	// 初始化 map
	d.Clear()

	return d
}

// TestDemo411 使用空接口实现可以保存任意值的字典
func TestDemo411() {
	// 创建词典实例
	dict := NewDictionary()

	// 添加游戏数据
	dict.Set("My Factory", 60)
	dict.Set("Home", 30)
	dict.Set("Money", 20)

	// 获取值并打印值
	favorite := dict.Get("Money")
	fmt.Println("favorite: ", favorite)

	// 遍历所有的字典元素
	dict.Visit(func(key, value interface{}) bool {
		// 将至转化为 int, 并判断是否大于 40
		if value.(int) > 40 {

			// 输出很贵
			fmt.Println(key, "is expensive")
			return true
		}

		// 默认值都是很便宜
		fmt.Println(key, "is cheap")

		return true
	})
}
